package com.geek.javase.ch18.videodemo.reflect.field;

import org.junit.Test;

import java.lang.reflect.Field;
import java.util.stream.Stream;

/*
 *@Date 2025/11/5
 *@Author wangpeng
 *@Description
 *  *  * 获取类中的属性的方法？
 *  * 1.public Field[] getFields()  获取类中的所有公开的属性
 *  * 2.public Field getField(String name) 根据传入的属性名称，获取公开的属性
 *  * 3.public Field[] getDeclaredFields() 获取类中所有属性（包括私有）
 *  * 4.public Field getDeclaredField(String name) 根据传入的属性名称，获取属性（包括私有）
 *
 */
public class FieldDemo1 {
    //1.public Field[] getFields()  获取类中的所有公开的属性
    @Test
    public void testGetFields() {
        // 获取类类型
        Class<Employee> clazz = Employee.class;

        //获取所有公开属性
        Field[] fields = clazz.getFields();
        Stream.of(fields).forEach(System.out::println);
    }

    //2.public Field getField(String name) 根据传入的属性名称，获取公开的属性
    @Test
    public void testGetField() throws NoSuchFieldException {
        // 获取类类型
        Class<Employee> clazz = Employee.class;

        //获取所有公开属性
        Field countField = clazz.getField("count");
        System.out.println(countField);
        //私有的属性
        /*Field nameField = clazz.getField("name");
        System.out.println(nameField);*/
    }

    //3.public Field[] getDeclaredFields() 获取类中所有属性（包括私有）
    @Test
    public void testGetDeclaredFields() {
        //获取类类型
        Class<Employee> clazz = Employee.class;

        //获取本类中的所有的属性（私有属性）
        Field[] fields = clazz.getDeclaredFields();

        Stream.of(fields).forEach(System.out::println);
    }
    //4.public Field getDeclaredField(String name) 根据传入的属性名称，获取属性（包括私有）
    @Test
    public void testGetDeclaredField() throws NoSuchFieldException {
        // 获取类类型
        Class<Employee> clazz = Employee.class;

        //公开的属性
        Field countField = clazz.getDeclaredField("count");
        System.out.println(countField);
        //私有的属性
        Field nameField = clazz.getDeclaredField("name");
        System.out.println(nameField);
    }
}
